網路應用程式進階學習,除了跨瀏覽器的支援考量外,測試跟效能也常常被提到,除了穩定性跟速度上的體驗更好,更重要的更是控制複雜度吧。
儘管測試跟效能牽涉到廣博的學習,在持續學習者的學習道路上,佔了一定的必要性,無論學習或實踐的程度如何,每次總有新的體會。
之後會看不同測試基本元件包括:斷言、測試群組、非同步測試,但最基本的概念就是這個執行是對或錯,然後顯示是對或錯。以下例子跟程式碼
如果錯誤就會顯示錯誤訊息,前者為判斷式,後者為錯誤訊息,像這樣惟其中一種的斷言設計方式。
//我們有一個像這樣格式的函式 assert(condtion, message)
function assert (condtion, message) {
return condtion ? 'PASS' : message
}
assert(1 === '1', '數字不相等')
我們可以用時間戳來測試這段程式要執行的時間,進行效能分析。但真正提到效能應該卻不只,還包括佔用的空間、程式寫法好壞、資源大小的處理、伺服器或網路快慢等等等,許多不同的面向,甚至到「使用者體驗的好效能」。
以下,簡單練習一個計算 1~1000000 的城市要花多久時間,約 16 ~ 44 毫秒
let maxCount = 1000000;
let start = new Date().getTime();
let total = 0;
for (var n = 0; n <= maxCount; n++) {
/* 執行想測量的動作*/
total = total + n;
}
let elapsed = new Date().getTime() - start;
console.log(total)
console.log(true, "Measure Time: " + elapsed);
其他有趣的發現,setTimeout 設定一秒,執行時間會差幾毫秒
let start = new Date().getTime();
let mark = setTimeout(()=>{
let elapsed = new Date().getTime() - start;
console.log(elapsed)
}, 1000)
AVA、Cypress、jest、Mocha、vitest 等等。
describe("groupBy()", function () {
it("需回傳以你定義的 key 的群組, () => {
// (1A)Arrange 初始化或要用的的參數
const roleModels = [
{
userId: 1,
name: "John Williams",
type: "Composer"
},
{
userId: 2,
name: "Hans Zimmer",
type: "Composer"
},
{
userId: 3,
name: "Michael Jordan",
type: "Athlete"
},
{
userId: 4,
name: "Stephen King",
type: "Author"
}
];
// (2A)Act 執行
const byType = groupBy(roleModels, "type");
// (3A)Assert 期待結果判斷
expect(byType).toMatchObject({
Athlete: [
{
name: "Michael Jordan",
type: "Athlete",
userId: 3
}
],
Author: [
{
name: "Stephen King",
type: "Author",
userId: 4
}
],
Composer: [
{
name: "John Williams",
type: "Composer",
userId: 1
},
{
name: "Hans Zimmer",
type: "Composer",
userId: 2
}
]
});
});
});
明天又能學到什麼呢? 下集待續
We Don't need an accurate document. We need a shared understanding. —— Jeff Patton
https://www.w3schools.com/js/js_timing.asp
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Classes/constructor
https://jestjs.io/
https://www.valentinog.com/blog/jest/
https://npmtrends.com/ava-vs-cypress-vs-jest-vs-mocha-vs-vitest
https://codepen.io/iamjpg/pen/jOqRXwd?editors=0010